home *** CD-ROM | disk | FTP | other *** search
/ Racing Games (Spidla) / zavodni.iso / Fun Racing / src / FRAmbulance.h < prev    next >
Encoding:
C/C++ Source or Header  |  2003-06-19  |  6.9 KB  |  271 lines

  1.  
  2.  
  3. #ifndef FRAMBULANCE_H
  4. #define FRAMBULANCE_H
  5.  
  6. #include "FRCar.h"
  7.  
  8. class FRAmbulance : public FRCar
  9. {
  10.     TERTTIDeclaration;
  11.  
  12. public:
  13.  
  14.     FRAmbulance(TEVector &rCenter, Float fInitYRot)
  15.     {
  16.         TEOBoundingBox *pOBox = new TEOBoundingBox;
  17.         TEAABoundingBox BBox;
  18.         TEVector Min, Max;
  19.         TEEngine *pEngine = TEEngine::GetEngine();
  20.         TESoundManager* pSound = TESoundManager::GetSoundManager();
  21.         TEString Pak = "EngineSFX";
  22.         TEString Name = "corona03";
  23.  
  24.         m_pSiren = TETextureManager::GetTextureManager()->GetTexture(Name, Pak, false, 1, true);
  25.         
  26.         Name = "motor3.ogg";
  27.         m_pMotor = pSound->GetSound(Name);
  28.         Name = "brake.ogg";
  29.         m_pBraking = pSound->GetSound(Name);
  30.         Name = "siren2.ogg";
  31.         m_pHorn = pSound->GetSound(Name);
  32.         
  33.         m_fMass = 3750.0f;
  34.  
  35.         m_fMaxRPM = 5000.0f;
  36.         m_fRotFactor = 85.0f;
  37.  
  38.         m_ulNumGears = 5;
  39.         m_aGears = new FRGearInfo[5];
  40.  
  41.         m_aGears[0].fRPMChange = 2500.0f;
  42.         m_aGears[0].fRPMTrans = -100.0f;
  43.         m_aGears[1].fRPMChange = 3500.0f;
  44.         m_aGears[1].fRPMTrans = 100.0f;
  45.         m_aGears[2].fRPMChange = 2000.0f;
  46.         m_aGears[2].fRPMTrans = 150.0f;
  47.         m_aGears[3].fRPMChange = 400.0f;
  48.         m_aGears[3].fRPMTrans = 250.0f;
  49.         m_aGears[4].fRPMChange = 150.0f;
  50.         m_aGears[4].fRPMTrans = 400.0f;
  51.  
  52.         m_Center = m_OldCenter = rCenter;
  53.         m_Rotation = TEVector(0.0f, fInitYRot, 0.0f);
  54.  
  55.         m_pModelRef = TEModelManager::GetModelManager()->GetModel("ambulance.tmf");
  56.         TEAssert(m_pModelRef);
  57.  
  58.         m_pModelRef->SetAnimation(0);
  59.         m_pModelRef->SetTimeScale(0);
  60.         m_pModelRef->SetLoopAnimation(true);
  61.         
  62.         BBox = m_pModelRef->GetModelBBox();
  63.         BBox.GetData(Min, Max);
  64.         m_CarSize = Max - Min;
  65.  
  66.         m_Center.m_fX = m_OldCenter.m_fX = rCenter.m_fX;
  67.         m_Center.m_fY = m_OldCenter.m_fY = m_fDeltaY = TEAbs(Min.m_fY) + 0.05f;
  68.         m_Center.m_fZ = m_OldCenter.m_fZ = rCenter.m_fZ;
  69.  
  70.         pOBox->SetData(m_Center, Min, Max, m_Rotation);
  71.  
  72.         m_pBoundingVolume = pOBox;
  73.  
  74.         m_fFrontAxis = 0.0f;
  75.         m_fRearAxis = -53.0f;
  76.  
  77.         m_fWheelWidth = 5.5f;
  78.         m_fWheelMov = 2.75f;
  79.  
  80.         m_aLightPos[0] = TEVector(-9.00f, -9.0f,  42.0f);
  81.         m_aLightPos[1] = TEVector( 9.00f, -9.0f,  42.0f);
  82.         m_aLightPos[2] = TEVector(-9.00f, -7.5f, -42.0f);
  83.         m_aLightPos[3] = TEVector( 9.00f, -7.5f, -42.0f);
  84.  
  85.         m_fBrakeEfficiency = 13.0f;
  86.  
  87.         UpdateVectors();
  88.  
  89.         if(ms_bSmoke)
  90.         {
  91.             TEVector Center = m_pBoundingVolume->GetCenter();
  92.             TEVector Tmp = Center + m_aExhaustPos[0].m_fX * m_Right +
  93.                 m_aExhaustPos[0].m_fY * m_Up + m_aExhaustPos[0].m_fZ * m_Forward;
  94.  
  95.             m_usNumExhaust = 1;
  96.             m_aExhaustPos[0] = TEVector(7.0f, -11.5f, -44.0f);
  97.  
  98.             m_aExhaust[0] = new TEParticleFX(Tmp, 2, 4, 1.6f, 0, 0, 0, m_Up, 250, 1000,
  99.                 255, 1.0f, true, false);
  100.  
  101.             m_aExhaust[0]->SetColor(255, 255, 255);
  102.  
  103.             pEngine->AddParticleSystem(m_aExhaust[0]);
  104.         }
  105.         
  106.         if(m_pMotor != NULL)
  107.             m_pMotor->Play3D(m_Center, m_Velocity, TESOUND_LOOP, 1.0f);
  108.  
  109.         m_bHornEnabled = false;
  110.         m_aSirenPos[0] = TEVector(-8.5f, 19.75f,  24.5f);
  111.         m_aSirenPos[1] = TEVector( 8.5f, 19.75f,  24.5f);
  112.         m_aSirenPos[2] = TEVector( 0.0f, 19.75f,  -36.25f);
  113.     }
  114.  
  115.     ~FRAmbulance()
  116.     {
  117.         SafeDelete(m_pSiren);
  118.     }
  119.  
  120.     void Horn(void)
  121.     {
  122.         if(!m_bHornEnabled)
  123.         {
  124.             if(m_pHorn != NULL && !m_pHorn->IsPlaying())
  125.                 m_pHorn->Play3D(m_Center, m_Velocity, TESOUND_LOOP, 3.0f);
  126.             
  127.             m_acSirenDir[0] = -1;
  128.             m_aucSirenState[0] = 255;
  129.             m_acSirenDir[1] = 1;
  130.             m_aucSirenState[1] = 0;
  131.             m_acSirenDir[2] = 1;
  132.             m_aucSirenState[2] = 128;
  133.  
  134.             m_bHornEnabled = true;
  135.         }
  136.         else
  137.         {
  138.             if(m_pHorn != NULL && m_pHorn->IsPlaying())
  139.                 m_pHorn->Stop();
  140.             
  141.             m_bHornEnabled = false;
  142.         }
  143.     }
  144.  
  145.     void Update(UInt32 ulDeltaT, TEEngine* pEngine)
  146.     {
  147.         FRCar::Update(ulDeltaT, pEngine);
  148.  
  149.         if(m_bHornEnabled)
  150.         {
  151.             for(UInt16 usCount = 0; usCount < 3; usCount++)
  152.             {
  153.                 Int16 sBuf = (Int16) (ulDeltaT * 1.5f);
  154.  
  155.                 if(m_acSirenDir[usCount] == 1)
  156.                     sBuf = m_aucSirenState[usCount] + sBuf;
  157.                 else sBuf = m_aucSirenState[usCount] - sBuf;
  158.  
  159.                 if(sBuf <= 0)
  160.                 {
  161.                     m_aucSirenState[usCount] = 0;
  162.                     m_acSirenDir[usCount] = 1;
  163.                 }
  164.                 else if(sBuf >= 255)
  165.                 {
  166.                     m_aucSirenState[usCount] = 255;
  167.                     m_acSirenDir[usCount] = -1;
  168.                 }
  169.                 else m_aucSirenState[usCount] = (UChar) sBuf;
  170.             }
  171.         }
  172.     }
  173.  
  174.     void Render(TERenderer* pRender, TECamera* pCam)
  175.     {
  176.         TEVector Tmp, Center, Cam;
  177.         Float fScale, fDist, fMaxCorona;
  178.  
  179.         if(m_Visibility == INVISIBLE)
  180.             return;
  181.         else if(m_Visibility == BLINKING)
  182.         {
  183.             UInt32 ulTmp, ulTime = TETimer::GetTimer()->GetElapsedTime(m_ulLastReset);
  184.             
  185.             if(ulTime < 2500)
  186.             {
  187.                 m_bClip = false;
  188.                 ulTmp = ulTime % 250;
  189.                 
  190.                 if(ulTmp > 75 + ulTime / 25)
  191.                     return;
  192.             }
  193.             else 
  194.             {
  195.                 m_Visibility = NORMAL;
  196.                 m_bClip = true;
  197.             }
  198.         }
  199.  
  200.         TEEngineObject::Render(pRender, pCam);
  201.         
  202.         fMaxCorona = TEEngine::GetEngine()->GetMaxCoronaDistance();
  203.         Cam = pCam->GetPosition();
  204.         Center = m_pBoundingVolume->GetCenter();
  205.         fDist = (Center - Cam).GetLength();
  206.         
  207.         if(fDist < fMaxCorona)
  208.         {
  209.             if(fDist > fMaxCorona/4.0f)
  210.                 fScale = MAX_LIGHT_SIZE;
  211.             else
  212.                 fScale = fDist * TEEngine::GetEngine()->GetCoronaFactor();
  213.             
  214.             if(fScale < MIN_LIGHT_SIZE)
  215.                 fScale = MIN_LIGHT_SIZE;
  216.             else if(fScale > MAX_LIGHT_SIZE)
  217.                 fScale = MAX_LIGHT_SIZE;
  218.             
  219.             pRender->SetZBufferState(false);
  220.             pRender->EnableBlending();
  221.             pRender->SetBlendingState(BLEND_SRC_ALPHA, BLEND_ONE);
  222.             
  223.             pRender->SetAmbient(255, 255, 255, 192);
  224.             
  225.             Tmp = Center + m_aLightPos[0].m_fX * m_Right + m_aLightPos[0].m_fY * m_Up + m_aLightPos[0].m_fZ * m_Forward;
  226.             pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
  227.  
  228.             Tmp = Center + m_aLightPos[1].m_fX * m_Right + m_aLightPos[1].m_fY * m_Up + m_aLightPos[1].m_fZ * m_Forward;
  229.             pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
  230.  
  231.             if(m_fPedal < 0)
  232.             {
  233.                 if(m_lCurrentGear == REVERSE_GEAR)
  234.                     pRender->SetAmbient(255, 255, 255, 255);
  235.                 else pRender->SetAmbient(255, 0, 0, 255);
  236.                 
  237.                 Tmp = Center + m_aLightPos[2].m_fX * m_Right + m_aLightPos[2].m_fY * m_Up + m_aLightPos[2].m_fZ * m_Forward;
  238.                 pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
  239.  
  240.                 Tmp = Center + m_aLightPos[3].m_fX * m_Right + m_aLightPos[3].m_fY * m_Up + m_aLightPos[3].m_fZ * m_Forward;
  241.                 pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
  242.             }
  243.  
  244.             if(m_bHornEnabled)
  245.             {
  246.                 pRender->SetAmbient(255, 255, 255, 255);
  247.                 fScale = fScale * 3.0f;
  248.  
  249.                 for(UInt16 usCount = 0; usCount < 3; usCount++)
  250.                 {
  251.                     pRender->SetAmbient(0, 0, m_aucSirenState[usCount], 255);
  252.                     Tmp = Center + m_aSirenPos[usCount].m_fX * m_Right + m_aSirenPos[usCount].m_fY * m_Up + m_aSirenPos[usCount].m_fZ * m_Forward;
  253.                     pRender->RenderParticle(Tmp, fScale, fScale, m_pSiren);
  254.                 }
  255.             }
  256.             pRender->SetZBufferState(true);
  257.             pRender->DisableBlending();
  258.         }
  259.     }
  260.  
  261. private:
  262.  
  263.     bool m_bHornEnabled;
  264.     TETextureReference* m_pSiren;
  265.     TEVector m_aSirenPos[3];
  266.     Char m_acSirenDir[3];
  267.     UChar m_aucSirenState[3];
  268. };
  269.  
  270. #endif
  271.